package com.routz.wxarticlelist.demo.web;

import com.routz.wxarticlelist.demo.service.WxArticleService;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.ResponseBody;

import javax.servlet.http.HttpSession;

/**
 * 微信公众号授权
 * 微信公众号文章获取
 */
@Controller
@RequestMapping("/")
public class WxArticleController {
    private static final Logger logger = LoggerFactory.getLogger(WxArticleController.class);

    // 一 获取access_token
    // 1. 预授权码获取
    // 2. 引导用户进入授权页(扫码授权)
    // 3. 用户同意授权
    // 4. 授权后回调URI，得到授权码和过期时间
    // 5. 利用授权码调用公众号api
    // 5.1 推送ticket协议
    // 5.2 获取第三方平台access_token
    // 二 根据access_token获取文章列表
    /**
     * 1. 预授权码获取
     */
    /**
     * 推送component_verify_ticket
     *
     * 出于安全考虑，在第三方平台创建审核通过后，
     * 在第三方平台创建审核通过后，微信服务器会向其“授权事件接收URL”每隔10分钟定时推送component_verify_ticket，
     * 用于获取第三方平台接口调用凭据
     * 第三方平台方在收到ticket推送后也需进行解密（详细请见【消息加解密接入指引】）
     * ，接收到后必须直接返回字符串success。
     */
    @PostMapping("/notice")
    @ResponseBody
    public String recvTicket(@RequestParam("timestamp") String timestamp,
                             @RequestParam("nonce") String nonce,
                             @RequestParam("msg_signature") String msgSignature,
                             @RequestBody String postData) throws Exception {
        logger.info("/notice");
        wxArticleService.recvTicket(timestamp, nonce, msgSignature, postData);
        return "success";
    }
    /**
     * 获取第三方平台component_access_token
     *
     * 第三方平台通过自己的component_appid（即在微信开放平台管理中心的第三方平台详情页中的AppID和AppSecret）和
     * component_appsecret，
     * 以及component_verify_ticket（每10分钟推送一次的安全ticket）来获取自己的接口调用凭据（component_access_token）
     */
    // 定时任务调度
    /**
     * 获取预授权码pre_auth_code
     *
     * 第三方平台通过自己的接口调用凭据（component_access_token）
     * 来获取用于授权流程准备的预授权码（pre_auth_code）
     */
    // 定时任务调度
    /**
     * 进入授权页进行授权
     */
    @GetMapping("/wx/authc")
    public String componentloginpage(String userId, HttpSession session) {
        session.setAttribute("userId", userId);
        logger.info("/authc");

        return "redirect:" + wxArticleService.getAuthcUrl();//---------------------
    }

    /**
     * 授权回调url
     */
    @GetMapping("/wx/authcallback")
    public String authPage(String auth_code, String expires_in, HttpSession session) {
        String userId = (String) session.getAttribute("userId");

        logger.info("/authPage" + ": userId" + userId);

        // 使用授权码换取公众号或小程序的接口调用凭据和授权信息
        String url = wxArticleService.authCallback(auth_code, expires_in, userId);

        return "redirect:" + url;
    }

    /**
     * 使用授权码换取公众号或小程序的接口调用凭据和授权信息
     */
//    @GetMapping("/")
//    public String makeAuthorizerAccessToken(WxUserInfo wxUserInfo) {
//        return wxAuthorizerAccessTokenService.makeAuthorizerAccessToken(wxUserInfo);
//    }
    /**
     * 使用accessToken获取wx 素材列表
     */
    @GetMapping("/wx/list")
    @ResponseBody
    public Object list(String type, Integer pageNum, Integer pageSize, String userId) {
        return wxArticleService.list(type, pageNum, pageSize, userId);
    }

    @GetMapping("/wx/info")
    @ResponseBody
    public Object info(String userId, String mediaId) {
        return wxArticleService.info(userId, mediaId);
    }

    @Autowired
    private WxArticleService wxArticleService;
}
